﻿using System;
using CTS.Com.Domain.Exceptions;
using CTS.Com.Domain.Helper;
using CTS.Data.Domain.Entity;
using CTS.Data.MACompanyInfos.Domain.Utils;
using CTS.W._150101.Models.Domain.Model.Admin.Settings.Info;
using CTS.Web.Com.Domain.Helper;

namespace CTS.W._150101.Models.Domain.Logic.Admin.Settings.Info
{
    /// <summary>
    /// UpdateLogic
    /// </summary>
    public class UpdateLogic
    {
        #region Execute Method
        /// <summary>
        /// Xử lý update.
        /// </summary>
        /// <param name="inputObject">DataModel</param>
        /// <returns>DataModel</returns>
        public UpdateDataModel Execute(UpdateDataModel inputObject)
        {
            // Kiểm tra thông tin
            Check(inputObject);
            // Cập nhật thông tin
            var resultObject = UpdateInfo(inputObject);
            // Kết quả trả về
            return resultObject;
        }
        #endregion

        #region Private Method
        /// <summary>
        /// Kiểm tra thông tin.
        /// </summary>
        /// <param name="inputObject">DataModel</param>
        private void Check(UpdateDataModel inputObject)
        {
            // Khởi tạo biến cục bộ
            var companyCom = new CompanyCom();
            // Khởi tạo biến dùng trong loop
            var i = 1;
            // Duyệt danh sách dữ liệu
            foreach (var data in inputObject.ListData) {
                // Kiểm tra bắt buộc
                if (DataCheckHelper.IsNull(data.LocaleCd)) {
                    var msg = MessageHelper.GetMessage("E_MSG_00001", "Ngôn ngữ");
                    throw new ExecuteException("E_MSG_00010", "P_CM_00022", i, msg.MessageDetail);
                }
                if (DataCheckHelper.IsNull(data.InfoCd)) {
                    var msg = MessageHelper.GetMessage("E_MSG_00001", "Mã thông tin");
                    throw new ExecuteException("E_MSG_00010", "P_CM_00022", i, msg.MessageDetail);
                }
                if (DataCheckHelper.IsNull(data.InfoValue)) {
                    var msg = MessageHelper.GetMessage("E_MSG_00001", "Giá trị");
                    throw new ExecuteException("E_MSG_00010", "P_CM_00022", i, msg.MessageDetail);
                }
                // Kiểm tra dữ liệu tồn tại
                var isExist = companyCom.IsExist(data.LocaleCd, data.InfoCd, true);
                if (!isExist) {
                    var msg = MessageHelper.GetMessage("E_MSG_00016", "Thông tin");
                    throw new ExecuteException("E_MSG_00010", "P_CM_00022", i, msg.MessageDetail);
                }
                // Tăng giá trị i
                i++;
            }
        }

        /// <summary>
        /// Cập nhật thông tin.
        /// </summary>
        /// <param name="inputObject">DataModel</param>
        /// <returns>DataModel</returns>
        private UpdateDataModel UpdateInfo(UpdateDataModel inputObject)
        {
            // Khởi tạo biến cục bộ
            var updateResult = new UpdateDataModel();
            var companyCom = new CompanyCom();
            var listData = DataHelper.CreateList<CompanyInfo>();
            // Map dữ liệu
            DataHelper.CopyObject(inputObject, updateResult);
            // Lấy danh sách dữ liệu
            foreach (var data in inputObject.ListData) {
                var tmp = DataHelper.CopyObject<CompanyInfo>(data);
                tmp.UpdateDate = DateTime.Now;
                tmp.UpdateUser = WebContextHelper.UserName;
                listData.Add(tmp);
            }
            // Cập nhật danh sách dữ liệu
            companyCom.UpdateBatch(listData);
            // Gán giá trị trả về
            updateResult.Messages.Add(MessageHelper.GetMessage("I_MSG_00004"));
            // Kết quả trả về
            return updateResult;
        }
        #endregion
    }
}
